#!/bin/bash
# 脚本功能说明：
# 该脚本用于打印指定的服务进程 ID 及端口号。支持通过参数指定要检查的服务，若未提供参数，则使用默认的服务列表。
# 定义默认服务列表
default_services=("redis" "nacos" "seata" "rabbit" "tomcat" "nginx" "docker" "minio" "mysql" "pgsql")
# 显示使用说明的函数
show_usage() {
    echo "使用方法: $0 [服务名称1 服务名称2 ...]"
    echo "  若不提供任何服务名称参数，脚本将使用默认的服务列表进行检查，默认服务列表为: ${default_services[*]}"
    echo "  示例 1: $0 redis mysql"
    echo "  示例 2: $0"
}
# 检查是否传入了 --help 或 -h 参数
for arg in "$@"; do
    if [ "$arg" = "--help" ] || [ "$arg" = "-h" ]; then
        show_usage
        exit 0
    fi
done
# 检查是否有参数传入
if [ $# -eq 0 ]; then
    # 没有参数传入，使用默认服务列表
    services=("${default_services[@]}")
else
    # 使用用户传入的参数作为服务列表
    services=("$@")
fi
# 遍历服务列表
for service in "${services[@]}"
do
    # 获取服务的进程 ID
    PID=$(ps -ef | grep "$service" | grep -v grep | awk '{print $2}' | tr '\n' ' ')
    PID=$(echo "$PID" | sed 's/ $//')  # 去除末尾的空格
    if [ -n "$PID" ]; then
        # 构建进程 ID 的正则表达式
        PIDREG=$(echo "$PID" | sed 's/ /|/g')
        # 获取服务监听的端口号
        PORT=$(netstat -anp | grep -E "$PIDREG" | grep LISTEN | grep -v grep | awk '{print $4}' | awk -F':' '{print $NF}' | tr '\n' ' ')
        PORT=$(echo "$PORT" | sed 's/ $//')  # 去除末尾的空格
        echo "$service is running, pid=$PID, port=$PORT"
    else
        echo "$service is not running"
    fi
done
